/*
 * @Descripttion   :
 * @version        :
 * @Author         :
 * @Date           : 2025-06-26 11:08
 * @LastEditTime   : 2025-06-26 11:09
 */

export default class CollisionSystem {
  constructor () {
    this.collidableObjects = []
    this.currentCollisions = new Map() // 存储当前帧的碰撞关系
    this.lastCollisions = new Map() // 存储上一帧的碰撞关系
  }

  // 添加可碰撞物体
  addObject (object) {
    this.collidableObjects.push(object)
  }

  // 更新碰撞检测
  update () {
    // 清空当前碰撞状态
    this.currentCollisions.clear()

    // 检测所有物体间的碰撞
    for (let i = 0; i < this.collidableObjects.length; i++) {
      for (let j = i + 1; j < this.collidableObjects.length; j++) {
        const obj1 = this.collidableObjects[i]
        const obj2 = this.collidableObjects[j]

        if (this.checkCollision(obj1, obj2)) {
          const key = `${obj1.uuid}-${obj2.uuid}`
          this.currentCollisions.set(key, { obj1, obj2 })
        }
      }
    }

    // 检测碰撞开始和结束
    this.detectCollisionEvents()

    // 更新上一帧碰撞状态
    this.lastCollisions = new Map(this.currentCollisions)
  }

  // 检测碰撞事件（开始、持续、结束）
  detectCollisionEvents () {
    // 检测新碰撞（开始碰撞）
    this.currentCollisions.forEach((value, key) => {
      if (!this.lastCollisions.has(key)) {
        console.log(`碰撞开始: ${value.obj1.name} 和 ${value.obj2.name}`)
        // 触发自定义事件或回调
        if (value.obj1.onCollisionEnter) value.obj1.onCollisionEnter(value.obj2)
        if (value.obj2.onCollisionEnter) value.obj2.onCollisionEnter(value.obj1)
      } else {
        // 持续碰撞
        // console.log(`持续碰撞: ${value.obj1.name} 和 ${value.obj2.name}`);
      }
    })

    // 检测碰撞结束
    this.lastCollisions.forEach((value, key) => {
      if (!this.currentCollisions.has(key)) {
        console.log(`碰撞结束: ${value.obj1.name} 和 ${value.obj2.name}`)
        // 触发自定义事件或回调
        if (value.obj1.onCollisionExit) value.obj1.onCollisionExit(value.obj2)
        if (value.obj2.onCollisionExit) value.obj2.onCollisionExit(value.obj1)
      }
    })
  }

  // 检测两个物体是否碰撞（简单包围盒检测）
  checkCollision (obj1, obj2) {
    // 更新世界矩阵
    obj1.updateMatrixWorld()
    obj2.updateMatrixWorld()

    // 获取包围盒
    const box1 = new GC.Box3().setFromObject(obj1)
    const box2 = new GC.Box3().setFromObject(obj2)

    return box1.intersectsBox(box2)
  }
}

// // 使用示例
// const collisionSystem = new CollisionSystem();

// // 添加可碰撞物体
// collisionSystem.addObject(mesh1);
// collisionSystem.addObject(mesh2);

// // 在动画循环中更新
// function animate() {
//   collisionSystem.update();
//   requestAnimationFrame(animate);
// }
// animate();
